%
% This work by Nik S Denin is licensed under a Creative Commons Attribution 3.0 Unported License.
% Original work can be found here: http://code.google.com/p/software-development-diploma/
%

\section{Разработка мобильного приложения для платформы Google Android}
\label{Chapter_3}

Для того, чтобы охватить широкий круг возможностей платформы Android, разработаем систему удалённого администрирования,
которая позволит пользователю мобильного устройства выполнять следующие действия:

\begin{itemize}
	\item получение журналов действий из указанной директории;
	\item выполнение скриптов и команд на удалённой машине.
\end{itemize}

В связи с тем, что доступ к удалённой машине будет осуществляться посредством беспроводной связи, необходимо учесть все
связанные с этим вопросы безопасности.

Для реализации удалённого доступа будем использовать протоколы SSH\footnote{SSH (\textit{англ. \textbf{S}ecure
\textbf{Sh}ell})--- сетевой протокол прикладного уровня, позволяющий производить удалённое управление операционной
системой и туннелирование TCP-соединений (например, для передачи файлов) \cite{Wikipedia}} и SCP\footnote{SCP
(\textit{англ. \textbf{s}ecure \textbf{c}o\textbf{p}y}) --- протокол RCP копирования файлов, использующий в качестве
транспорта не RSH, а SSH.}. Причины выбора данных протоколов обуславливаются тем, что SSH шифрует весь трафик, включая
передаваемые пароли. Протокол SCP построен на основе SSH, соответственно, весь трафик, передающийся при использовании
SCP, так же шифруется.

\subsection{Подготовка инструментария}
\label{subsec:Instruments}

Разработку приложений под Android можно проводить под операционными системами, для которых существует набор
инструментов разработчика (SDK). На данный момент поддерживаются следующие операционные системы:

\begin{itemize}
	\item Windows;
	\item Mac OS X (Intel);
	\item Linux (i386).
\end{itemize}

Если требуется вести разработку под неподдерживаемой операционной системой, можно воспользоваться технологиями
виртуализации и развернуть в виртуальном рабочем пространстве поддерживаемую операционную систему.

При разработке можно использовать IDE Eclipse, так как для неё существует подключаемый модуль, распространяемый
компанией Google и значительно упрощающий процесс разработки приложений для Android.

Все вышеперечисленные компоненты находятся в свободном доступе в сети Интернет. Их можно загрузить по следующим адресам:

\begin{itemize}
	\item http://developer.android.com/sdk (Android SDK и подключаемый модуль для Eclipse IDE);
	\item http://eclipse.org (Eclipse IDE).
\end{itemize}

\subsection{Структура приложения}
\label{subsec:ApplicationStructure}

Структура будущего приложения показана на рисунке~\ref{fig:ApplicationStructure}. Основными компонентами приложения
являются следующие:

\begin{itemize}
	\item модуль взаимодействия с удалённой машиной (клиент SCP и SSH);
	\item модуль хранения журналов, полученных с удалённой машины;
	\item модуль хранения скриптов. 
\end{itemize}

\begin{figure}[h]
\center{\includegraphics[width=16cm]{ApplicationStructure}}
\caption{Структура мобильного приложения}
\label{fig:ApplicationStructure}
\end{figure}

Рассмотрим структуру приложения подробнее.

\subsubsection{Взаимодействие с удалённой машиной}
\label{subsubsec:RemoteInteraction}

Взаимодействие с удалённой машиной реализуется с помощью пакета <<Trilead SSH2>> от компании Trilead. Данный
пакет без модификаций собирается для платформы Android (он используется в довольно популярном приложении
<<ConnectBot>>, которое можно найти в хранилище AndAppStore) и имеет две зависимости: JSOCKS (сервер SOCKS, написанный на Java) и JZLib
(реализация библиотеки сжатия zlib на Java). Оба пакета, от которых зависит <<Trilead SSH2>>, распространяются под
свободными BSD-лицензиями\footnote{Лицензия BSD, Программная лицензия университета Беркли (\textit{англ. BSD license})
--- лицензионное соглашение, впервые применённое для распространения UNIX-подобных операционных систем BSD. Позже
исходная версия лицензии была подвергнута ряду изменений, породив множество лицензий, обобщённо именуемых <<лицензии
типа BSD>>. В настоящее время лицензии типа BSD являются одними из самых популярных лицензий для свободного
программного обеспечения и используются для многих программ (помимо BSD-версий UNIX, для которых лицензия BSD была
изначально создана).}.

Взаимодействие с удалённой машиной в приложении возможно в следующих вариантах:

\begin{itemize}
	\item получение журналов по протоколу SCP;
	\item удалённое выполнение скриптов или команд по протоколу SSH.
\end{itemize}

Учётные данные для доступа к удалённой системе находятся в хранилище настроек приложения.

Модуль взаимодействия с удалённой машиной связан с модулями хранения и настроек журналов, модулем хранения
скриптов, модулем отчётов об ошибках и модулем хранилища настроек.

\subsubsection{Хранение и просмотр журналов}
\label{subsubsec:Logs}

К данной составляющей приложения относятся два модуля: модуль хранения журналов и модуль настроек журналов.

\paragraph{Модуль настроек журналов.}

Данный модуль позволяет сохранять для дальнейшего использования путь к журналам на удалённой машине. В окне
пользовательского интерфейса, управляющем данным модулем, пользователь может ввести метку списка журналов (для
дальнейшего удобства и навигации) и полный путь к журналам на удалённой машине. Например, если пользователь хочет
получать все журналы сервера Apache, он может ввести следующие параметры:

\begin{bash}
Apache
/var/log/apache/
\end{bash}

Для получения журналов СУБД MySQL пользователь может указать следующие параметры:

\begin{bash}
MySQL
/var/log/mysql
\end{bash}

Количество файлов журналов, которые будут храниться в устройстве (данное ограничение оправдано по той причине, что
объём памяти, выделяемой для хранения пользовательских данных, сравнительно мал), указывается в основном модуле
настроек приложения.

Данный модуль работает в связке с модулем взаимодействия с удалённой машиной для получения новых журналов и с модулем
настроек приложения. Полученные журналы передаются в модуль хранения, который сохраняет полученные данные в памяти
устройства и позволяет осуществлять доступ к ним.

\paragraph{Модуль хранения журналов.} Данный модуль осуществляет доступ к сохранённым на устройстве журналам. Он
сопоставляет метку, записанную в настройках модуля, со списком файлов и может отдавать содержимое этих файлов для
просмотра в элементы пользовательского интерфейса. Также он осуществляет управление хранилищем журналов (удаление,
поиск и т.д.).

Данный модуль получает информацию от модуля взаимодействия с удалённой машиной и отдаёт её в элементы пользовательского
интерфейса (списки журналов в соответствии с метками и содержимое отдельных журналов).

\subsubsection{Удалённое выполнение скриптов}
\label{subsubsec:RemoteScriptExecution}

Данный модуль реализует функционал хранилища скриптов и передачу этих скриптов модулю взаимодействия с удалённой
машиной. Скрипты могут состоять как из одной команды (например, перезагрузка или запуск определённого сервиса), так и из
нескольких.

Скрипты, состоящие из нескольких команд, представляют собой текстовые файлы, написанные на языке сценария и выполняемые
командной оболочкой\footnote{Командная оболочка UNIX (\textit{англ. Unix shell, часто просто <<шелл>> или <<sh>>}) ---
командный интерпретатор, используемый в операционных системах семейства UNIX. В первую очередь, под shell понимаются
POSIX-совместимые оболочки, восходящие к Bourne shell, появившемуся в Unix Version 7. На данный момент наиболее
распространёнными командными оболочками являются bash, zsh, csh, tcsh и ksh. \cite{Wikipedia}}

Для написания скриптов используется простой текстовый редактор на базе стандартных элементов пользовательского
интерфейса Android. После написания скрипт сохраняется в памяти устройства и снабжается меткой для удобства вызова и
поиска. Например, для перезапуска сетевых служб, выполняющихся на удалённой машине, можно создать следующий скрипт и
снабдить его соответствующей меткой:

\begin{bash}
Restart network daemons

#!/bin/bash
/etc/init.d/samba restart
/etc/init.d/apache2 restart
/etc/init.d/ntpd restart
\end{bash}

Созданные пользователем скрипты сохраняются в хранилище, и данные о них представляются пользователю в виде списка
меток, присвоенных каждому скрипту. При выборе скрипта его содержимое передаётся модулю взаимодействия, который
отправляет скрипт на удалённую машину и запускает его.

\subsubsection{Пользовательский интерфейс}
\label{subsubsec:ApplicaitonGUI}

Пользовательский интерфейс приложения состоит из следующих элементов:

\begin{itemize}
	\item Основной интерфейс --- родительский интерфейс, включающий в себя следующие элементы:
	\begin{itemize}
        \item Окно взаимодействия с журналами;
        \item Окно взаимодействия со скриптами;
    \end{itemize}
    \item Дополнительные окна, вызываемые из меню:
    \begin{itemize}
        \item Окно настроек приложения;
        \item Окно просмотра сообщений об ошибках доступа к удалённой машине.
	\end{itemize}
\end{itemize}

Основная масса элементов пользовательского интерфейса платформы Android может быть описана в XML-файлах, что
значительно облегчает процесс разработки.

\begin{figure}[h]
\center{\includegraphics[width=9cm]{application_screen_1}}
\caption{Главное окно приложения}
\label{fig:MainApplicationWindow}
\end{figure}

Основное окно приложения, представленное на рисунке~\ref{fig:MainApplicationWindow}, формируется файлом следующего вида:

\begin{xml}
<?xml version="1.0" encoding="utf-8"?>

<TabHost
xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@android:id/tabhost"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TabWidget
      android:id="@android:id/tabs"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content" />
    <FrameLayout
      android:id="@android:id/tabcontent"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">
      <ListView android:id="@+id/logslist"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
      <ListView android:id="@+id/scriptslist"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    	</FrameLayout>
  </LinearLayout>
</TabHost>
\end{xml}

Меню приложения, вызываемое нажатием кнопки <<Menu>> на устройстве, также описывается XML-файлом:

\begin{xml}
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android">
  <item
    android:title="Settings"
    android:id="@+id/settings" />
  <item
    android:title="Error log"
    android:id="@+id/errorlog" />
</menu>
\end{xml}

Основные окна пользовательского интерфейса приведены в Приложении А.

\subsection{Связка клиент-сервер}
\label{subsec:ClientServerInteraction}

Как уже было сказано выше, описываемое приложение работает как клиент SSH и SCP, взаимодействуя с удалённой машиной.
Для получения файлов с удалённой машины используется протокол SCP. Для удалённого выполнения команд и скриптов
используется протокол SSH.

Рассмотрим принципы работы данных протоколов в действии.

\subsubsection{Получение файлов по протоколу SCP}
\label{subsubsec:SCP}

Протокол SCP осуществляет только передачу данных. Приложение подключается к серверу с помощью SSH, и затем запускает на
удалённой машине сервер SCP. Для загрузки файлов на удалённую машину клиент передаёт сами файлы, а также (опционально)
их основные атрибуты (права доступа, время создания и т.д.). Для получения файлов на удалённую машину посылается
соответствующий запрос, и сервер scp на удалённой машине начинает передавать запрошенные файлы (или каталоги с их
содержимым). Так как процесс загрузки управляется сервером, есть определённые проблемы с безопасностью при доступе к
<<опасным>> серверам.

\subsubsection{Выполнение команд по протоколу SSH}
\label{subsubsec:SSH}

Для работы по протоколу SSH необходима связка <<клиент-сервер>>. Сервер SSH, запущенный на удалённой машине,
прослушивает соединения от клиентских машин и при установлении связи производит аутентификацию, после чего начинает
обслуживание клиента. Клиент используется для входа на удаленную машину и выполнения команд.

Для соединения сервер и клиент должны создать пары ключей --- открытых и закрытых --- и обменяться открытыми ключами.
После этого ключи сохраняются и используются при каждом подключении к системе. Обычно при входе используется также и
пароль.

Для выполнения удалённых команд серверу передаётся строка, содержащая команду и её параметры, сервер принимает эту
строку и отправляет её на выполнение операционной системе.

Диаграмма взаимодействия <<клиент-сервер>> по протоколу SSH представлена на рисунке~\ref{fig:SSH}.

\begin{figure}[h]
\center{\includegraphics[width=14cm]{ClientServerInteraction}}
\caption{Диаграмма взаимодействия <<клиент-сервер>>}
\label{fig:SSH}
\end{figure}
